package com.example.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * Token帮助工具类
 * 每次调用时从请求头中获取Token并解析用户信息
 * 采用主动解析的方式，符合Spring Boot最佳实践
 */
@Component
public class TokenHelper {

    @Autowired
    private JwtUtils jwtUtils;

    /**
     * 从当前请求中获取Token
     */
    private String getTokenFromRequest() {
        try {
            ServletRequestAttributes attributes = 
                (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
            
            String authHeader = request.getHeader("Authorization");
            if (authHeader != null && authHeader.startsWith("Bearer ")) {
                return authHeader.substring(7);
            }
            return null;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 获取当前登录用户的用户名
     * 每次调用时重新从Token中解析
     * 
     * @return 当前登录用户的用户名，如果未登录或Token无效则返回null
     */
    public String getCurrentUsername() {
        String token = getTokenFromRequest();
        if (token == null) {
            return null;
        }
        
        try {
            if (jwtUtils.isTokenValid(token)) {
                return jwtUtils.getUsernameFromToken(token);
            }
        } catch (Exception e) {
            // Token解析失败
        }
        return null;
    }

    /**
     * 获取当前登录用户的用户ID
     * 每次调用时重新从Token中解析
     * 
     * @return 当前登录用户的用户ID，如果未登录或Token无效则返回null
     */
    public Long getCurrentUserId() {
        String token = getTokenFromRequest();
        if (token == null) {
            return null;
        }
        
        try {
            if (jwtUtils.isTokenValid(token)) {
                return jwtUtils.getUserIdFromToken(token);
            }
        } catch (Exception e) {
            // Token解析失败
        }
        return null;
    }

    /**
     * 检查当前是否有用户登录
     * 
     * @return 如果有用户登录返回true，否则返回false
     */
    public boolean isAuthenticated() {
        return getCurrentUsername() != null;
    }

    /**
     * 检查当前登录用户是否为指定用户名
     * 
     * @param username 要检查的用户名
     * @return 如果当前用户是指定用户返回true，否则返回false
     */
    public boolean isCurrentUser(String username) {
        String currentUsername = getCurrentUsername();
        return currentUsername != null && currentUsername.equals(username);
    }

    /**
     * 获取当前用户的完整信息（用户名和ID）
     * 
     * @return 包含用户名和ID的数组，[username, userId]，如果未登录则返回null
     */
    public Object[] getCurrentUserInfo() {
        String token = getTokenFromRequest();
        if (token == null) {
            return null;
        }
        
        try {
            if (jwtUtils.isTokenValid(token)) {
                String username = jwtUtils.getUsernameFromToken(token);
                Long userId = jwtUtils.getUserIdFromToken(token);
                return new Object[]{username, userId};
            }
        } catch (Exception e) {
            // Token解析失败
        }
        return null;
    }
}
